﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Odbc;
using System.Configuration;

/// <summary>
/// Summary description for ProdutoCategoriaDAL
/// </summary>
public class ProdutoCategoriaDAL
{

    public int id {get;set;}
    public int idProduto {get;set;}
    public int idCategoria {get;set;}
    public string NomeProduto { get; set; }
    public List<int> lCategoria { get; set; }

    public int codRetorno { get; set; }
    public string msgRetorno { get; set; }

    public static List<ProdutoCategoriaDAL> selecionaTodos() {
        List<ProdutoCategoriaDAL> lpc = new List<ProdutoCategoriaDAL>();
        try {
            using (OdbcConnection con = new OdbcConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
            using (OdbcCommand cmd = new OdbcCommand("SELECT PC.idProdutoCategoria, PC.idProduto, PC.idCategoria, P.NomeProduto FROM tbProdutoCategoria PC INNER JOIN tbProduto P on (P.idProduto=PC.idProduto) ", con))
            {

                con.Open();
                OdbcDataReader rs = cmd.ExecuteReader();
                while (rs.Read())
                {
                    ProdutoCategoriaDAL oPC = new ProdutoCategoriaDAL();
                    oPC.id = Convert.ToInt32(rs["idProdutoCategoria"]); ;   
                    oPC.idProduto = Convert.ToInt32(rs["idProduto"]); ;
                    oPC.idCategoria = Convert.ToInt32(rs["idCategoria"]);
                    oPC.NomeProduto = rs["NomeProduto"].ToString();
                    lpc.Add(oPC);

                }
                rs.Close();
                con.Close();
            }
        }
        catch (Exception ex)
        {
            ProdutoCategoriaDAL oPC = new ProdutoCategoriaDAL();
            oPC.codRetorno = 0;
            oPC.msgRetorno = "Falha ao consultar o registro: " + ex.Message;
            lpc.Add(oPC);
        }
        return lpc;
    }

    public List<ProdutoCategoriaDAL> selecionaPorId()
    {
       
        try
        {
            string cmdsql;
            string parametro;
            int id;
            if (this.idProduto != 0) {
                cmdsql      = "SELECT PC.idProdutoCategoria, PC.idProduto, PC.idCategoria, P.NomeProduto FROM tbProdutoCategoria PC INNER JOIN tbProduto P on (P.idProduto=PC.idProduto) WHERE PC.idProduto = ? ";
                parametro   = "@idProduto";
                id          = this.idProduto;
            } else {
                cmdsql      = "SELECT PC.idProdutoCategoria, PC.idProduto, PC.idCategoria, P.NomeProduto FROM tbProdutoCategoria PC INNER JOIN tbProduto P on (P.idProduto=PC.idProduto) WHERE PC.idCategoria = ? ";
                parametro   = "@idCategoria";
                id          = this.idCategoria;
            }
            using (OdbcConnection con = new OdbcConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
            using (OdbcCommand cmd = new OdbcCommand(cmdsql, con))
            {
                List<ProdutoCategoriaDAL> lpc = new List<ProdutoCategoriaDAL>();
                cmd.Parameters.Add(parametro, OdbcType.Int).Value = id ; 
                con.Open();
                OdbcDataReader rs = cmd.ExecuteReader();
                while (rs.Read())
                {
                    // se for um pra um, pega idCategoria
                    this.idCategoria = Convert.ToInt32(rs["idCategoria"]); 

                    ProdutoCategoriaDAL ooPC = new ProdutoCategoriaDAL();
                    ooPC.id = Convert.ToInt32(rs["idProdutoCategoria"]); ;
                    ooPC.idProduto = Convert.ToInt32(rs["idProduto"]); ;
                    ooPC.idCategoria = Convert.ToInt32(rs["idCategoria"]);
                    ooPC.NomeProduto = rs["NomeProduto"].ToString();
                    lpc.Add(ooPC);
                }
                rs.Close();
                con.Close();
                return lpc;
            }
            
        }
        catch (Exception ex)
        {
            List<ProdutoCategoriaDAL> lpc = new List<ProdutoCategoriaDAL>();
            ProdutoCategoriaDAL oPC = new ProdutoCategoriaDAL();
            oPC.codRetorno = 0;
            oPC.msgRetorno = "Falha ao consultar o registro: " + ex.Message;
            lpc.Add(oPC);
            return lpc;
        }
        
    }
    public void incluir()
    {
        try
        {
            using (OdbcConnection con = new OdbcConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
            using (OdbcCommand cmd = new OdbcCommand("DELETE FROM tbProdutoCategoria WHERE idProduto = ? ", con)) 
            {
                cmd.Parameters.Add("@idProduto", OdbcType.Int).Value = this.idProduto;
                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();
            }

            foreach (int idcat in lCategoria)
            {
                using (OdbcConnection con = new OdbcConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
                using (OdbcCommand cmd = new OdbcCommand("INSERT INTO tbProdutoCategoria (idProduto, idCategoria) VALUES (?, ?) ", con))
                {
                    cmd.Parameters.Add("@idProduto", OdbcType.Int).Value = this.idProduto;
                    cmd.Parameters.Add("@idCategoria", OdbcType.Int).Value = idcat;
                    con.Open();
                    cmd.ExecuteNonQuery();
                    con.Close();
                }
                this.msgRetorno = "Registro inserido com sucesso";
                this.codRetorno = 0;
            }
        }
        catch (Exception ex)
        {
            this.codRetorno = 1;
            this.msgRetorno = "Falha ao incluir com sucesso!" + ex.Message;
        }
    }

        public ProdutoCategoriaDAL()
        {
        lCategoria= new List<int>();
        this.idProduto = 0;
        this.idCategoria = 0;

        }
}